#include<bits/stdc++.h>
using namespace std;
int T,n,m,L,V,d[100005],v[100005],a[100005],p[1000005],q[1000005],g;
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>T;
    while(T--){
        g=0;
        cin>>n>>m>>L>>V;
        for(int i=1;i<=n;i++)cin>>d[i]>>v[i]>>a[i];
        vector<pair<int,int> >G;
        for(int i=1;i<=L;i++)p[i]=0;
        for(int i=1,x;i<=m;i++){
            cin>>x;
            p[x]=1;
        }
        q[0]=1;
        for(int i=1;i<=L;i++){
            if(p[i-1]==1)q[i]=q[i-1]+1;
            else q[i]=q[i-1];
        }
        for(int i=1;i<=L;i++)p[i]+=p[i-1];
        for(int i=1;i<=n;i++){
            if(v[i]<=V&&a[i]<=0)continue;
            else if(v[i]>V&&a[i]>=0){
                if(d[i]==0&&p[L]>0)g++,G.push_back({q[d[i]],p[L]});
                else if(p[L]-p[d[i]-1]>0)g++,G.push_back({q[d[i]],p[L]});
                else continue;
            }
            else if(v[i]==V){
                if(d[i]+1<=L&&p[L]-p[d[i]]>0)g++,G.push_back({q[d[i]],p[L]});
                else continue;
            }
            else{
                int t=L,e;
                if(a[i]<0)t=min(t,d[i]+v[i]*v[i]/(-a[i])/2);
                if(v[i]<V){
                    e=d[i]+(V*V-v[i]*v[i])/2/a[i]+1;
                    if(e==0&&p[t]>0)g++,G.push_back({q[e],p[t]});
                    else if(p[t]-p[e-1]>0)g++,G.push_back({q[e],p[t]});
                    else continue;
                }
                else{
                    int ee=V*V-v[i]*v[i];
                    e=d[i]+(ee)/2/a[i]-(ee%(2*a[i])==0);
                    e=min(e,t);
                    if(d[i]==0&&p[e]>0)g++,G.push_back({q[d[i]],p[e]});
                    else if(p[e]-p[d[i]-1]>0)g++,G.push_back({q[d[i]],p[e]});
                    else continue;
                }
            }
        }
        cout<<g<<' ';
        g=0;
        bool f[100005]={0};
        int o[100005]={0},F[100005]={0};
        for(int i=0;i<G.size();i++){
            o[G[i].first]++;
            o[G[i].second+1]--;
            if(G[i].second==G[i].first)f[G[i].first]=1;
        }
        for(int i=1;i<=m;i++){
            o[i]+=o[i-1];
            F[i]=F[i-1];
            if(f[i]==1)F[i]++;
        }
        for(int i=0;i<G.size();i++){
            if(F[G[i].second]-F[G[i].first-1]>0){
                for(int j=G[i].first;j<=G[i].second;j++)o[j]--;
            }
        }
        for(int i=0;i<G.size();i++){
            if(F[G[i].second]-F[G[i].first-1]==0){
                int xx=o[G[i].first],yy=G[i].first;
                for(int j=G[i].first+1;j<=G[i].second;j++){
                    if(o[j]>xx)xx=o[j],yy=j;
                }
                f[yy]=1;
                for(int j=yy;j<=m;j++)F[j]++;
            }
        }
        cout<<m-F[m]<<endl;
    }
    return 0;
}
